package com.hezuti.common.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * 数字 工具类
 * 
 * @author xiaoyu.dou
 *
 */
public class DecimalUtil {
	/**
	 * 测试main
	 * @param args
	 */
	public static void main(String[] args) {
		/*
		 * System.out.println(formatDecimal(1.2938934,4)==1.2939);
		 * System.out.println(formatDecimal(6.327,2)==6.33);
		 * System.out.println(formatDecimal
		 * (0.050617283950617283950617283950617,3)==0.051);
		 * System.out.println(1382.00/20);
		 * System.out.println(Math.round(Math.ceil(1382.00/20)));
		 * System.out.println(Math.ceil(2.9));
		 */
		System.out.println(changeToMaxInteger(13745, 20));

	}

	/**
	 * 格式化double 数字，保留指定位数小数点
	 * 
	 * @param value
	 * @param decimalLength
	 * @return
	 */
	public static double formatDecimal(double value, int decimalLength) {
		return new BigDecimal(value).setScale(decimalLength, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	/**
	 * 格式化数字
	 * @param object
	 * @param decimalLength
	 * @return
	 */
	public static double formatDecimal(Object object, int decimalLength) {
		if (object == null)
			return 0;
		String value = object.toString();
		return new BigDecimal(value).setScale(decimalLength, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	/**
	 * value除以 div  得到整数
	 * 
	 * @param value
	 * @param div
	 * @return
	 */
	public static int changeToMaxInteger(double value, double div) {
		float aa = (float) Math.ceil(value / div);
		return Math.round(aa);
	}
	/**
	 * value除以 div  得到整数
	 * @param value
	 * @param div
	 * @return
	 */
	public static int changeToMaxInteger(int value, int div) {
		return changeToMaxInteger(new Double(value).doubleValue(), new Double(div).doubleValue());
	}

	/**
	 * 除，结果四舍五入
	 */
	public static double div(int v1, int v2, int scale) {
		if (v2 == 0)
			return 0;
		long val = ((long) (v1) * (int) Math.pow(10, (scale + 1))) / ((int) v2);
		return Math.round((double) val / 10f) / (Math.pow(10, scale));
	}

	/**
	 * 乘法
	 * 
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static double mult(double v1, double v2, int scale) {
		BigDecimal bv1 = BigDecimal.valueOf(v1);
		return bv1.multiply(BigDecimal.valueOf(v2)).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();

	}

	/**
	 * 除，结果四舍五入(long参数)
	 */
	public static double div(long v1, long v2, int scale) {
		if (v2 == 0)
			return 0;
		long val = ((v1) * (long) Math.pow(10, (scale + 1))) / (v2);
		return Math.round((double) val / 10f) / (Math.pow(10, scale));
	}

	/**
	 * 除，结果四舍五入(double,int参数)
	 */
	public static double div(double v1, int v2, int scale) {
		if (v2 == 0)
			return 0;
		BigDecimal bv1 = BigDecimal.valueOf(v1);
		return bv1.divide(BigDecimal.valueOf(v2), scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}
	
	
	/**
	 * 除,结果以string返回
	 * @param v1
	 * @param v2
	 * @param scale
	 * @return
	 */
	public static String divString(double v1, double v2, int scale) {
		DecimalFormat df =(DecimalFormat)NumberFormat.getInstance();
		return df.format(div(v1, v2, scale));
	}
	
	/**
	 * 格式化输出double型数据
	 * @param v1
	 * @param scale
	 * @return
	 */
	public static String formatToString(double v1, int scale) {
		DecimalFormat df =(DecimalFormat)NumberFormat.getInstance();
		df.setMaximumFractionDigits(2);
		return df.format(v1);
	}
	
	
	/**
	 * 除，结果四舍五入(double,double参数)
	 */
	public static double div(double v1, double v2, int scale) {
		if (v2 == 0)
			return 0;
		BigDecimal bv1 = BigDecimal.valueOf(v1);
		return bv1.divide(BigDecimal.valueOf(v2), scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 四舍五入小数
	 * 
	 * @param v1
	 * @param scale
	 * @return
	 */
	public static double round(double v1, int scale) {
		BigDecimal bv1 = BigDecimal.valueOf(v1);
		return bv1.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 从Integer对象里取整形值，如果为null，返回0
	 * 
	 * @param o
	 * @return
	 */
	public static int getIntegerValue(Object o) {
		try {
			return Integer.parseInt(o.toString().trim());
		} catch (Exception ex) {
			return 0;
		}
	}
}
